package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.album.config.VodConstantProperties;
import com.atguigu.tingshu.album.service.VodService;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.vo.album.TrackMediaInfoVo;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.*;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class VodServiceImpl implements VodService {

    @Autowired
    private VodConstantProperties vodConstantProperties;

    /**
     * 获取媒体文件信息
     * 通过媒体文件ID从腾讯云视频点播服务中获取媒体信息，并封装到TrackMediaInfoVo对象中
     *
     * @param mediaFileId 媒体文件ID，用于标识特定的媒体文件
     * @return TrackMediaInfoVo对象，包含媒体文件的详细信息，如果获取失败则返回null
     */
    @Override
    public TrackMediaInfoVo getMediaInfo(String mediaFileId) {
        // 创建TrackMediaInfoVo对象，用于存储媒体信息
        TrackMediaInfoVo trackMediaInfoVo = new TrackMediaInfoVo();
        try {
            // 初始化腾讯云API凭证
            Credential cred = new Credential(vodConstantProperties.getSecretId(), vodConstantProperties.getSecretKey());
            // 创建VodClient客户端，用于调用腾讯云视频点播API
            VodClient vodClient = new VodClient(cred, vodConstantProperties.getRegion());
            // 创建请求对象，设置要查询的媒体文件ID
            DescribeMediaInfosRequest req = new DescribeMediaInfosRequest();
            String[] fileIds = new String[]{mediaFileId};
            req.setFileIds(fileIds);

            // 调用API获取媒体信息
            DescribeMediaInfosResponse resp = vodClient.DescribeMediaInfos(req);
            // 如果响应为空，抛出异常
            if (resp == null) {
                throw new GuiguException(20001, "获取流媒体信息失败");
            }
            // 打印响应的JSON字符串，用于调试
            System.out.println(AbstractModel.toJsonString(resp));
            // 获取媒体信息集合
            MediaInfo[] mediaInfoSet = resp.getMediaInfoSet();
            // 从媒体信息中提取所需信息，并设置到TrackMediaInfoVo对象中
            trackMediaInfoVo.setMediaUrl(mediaInfoSet[0].getBasicInfo().getMediaUrl());
            trackMediaInfoVo.setType(mediaInfoSet[0].getBasicInfo().getType());
            trackMediaInfoVo.setSize(mediaInfoSet[0].getMetaData().getSize());
            trackMediaInfoVo.setDuration(mediaInfoSet[0].getMetaData().getDuration());
            // 返回封装好的TrackMediaInfoVo对象
            return trackMediaInfoVo;
        } catch (TencentCloudSDKException e) {
            // 打印异常信息
            System.out.println(e.toString());
        }
        // 如果发生异常，返回null
        return null;
    }

    /**
     * 根据媒体文件ID删除声音
     * 本方法用于调用腾讯云点播服务，删除指定的媒体文件
     *
     * @param mediaFileId 媒体文件的唯一标识符，用于指定需要删除的文件
     * @throws Exception 腾讯云SDK可能会抛出的异常，此处使用SneakyThrows注解处理
     */
    @SneakyThrows
    @Override
    public void removeMediaFileById(String mediaFileId) {
        // 创建Credential对象，使用腾讯云的密钥对进行身份验证
        Credential credential = new Credential(vodConstantProperties.getSecretId(), vodConstantProperties.getSecretKey());
        // 初始化VodClient客户端，用于与腾讯云点播服务进行交互
        VodClient vodClient = new VodClient(credential, "");
        // 创建DeleteMediaRequest请求对象，准备删除媒体文件
        DeleteMediaRequest request = new DeleteMediaRequest();
        // 设置需要删除的媒体文件ID
        request.setFileId(mediaFileId);
        // 调用DeleteMedia方法，发送删除请求，并获取响应结果
        DeleteMediaResponse response = vodClient.DeleteMedia(request);
        // 记录删除媒体文件的响应结果
        log.info("声音删除返回结课: {}", JSON.toJSONString(response));
    }

}
